home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 Applications 1996 May / SGI IRIX 6.2 Applications 1996 May.iso / dist / impr_dev.idb / usr / include / imp.h.z / imp.h
C/C++ Source or Header  |  1996-05-06  |  15KB  |  422 lines

  1. /**************************************************************************
  2.  *
  3.  *           Copyright (c)    1993 Silicon Graphics, Inc.
  4.  *            All Rights Reserved
  5.  *
  6.  *       THIS    IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SGI
  7.  *
  8.  * The copyright notice above does not evidence any actual of intended
  9.  * publication of such source code, and is an unpublished work by Silicon
  10.  * Graphics, Inc. This material contains CONFIDENTIAL INFORMATION that is
  11.  * the property of Silicon Graphics, Inc. Any use, duplication or
  12.  * disclosure not specifically authorized by Silicon Graphics is strictly
  13.  * prohibited.
  14.  *
  15.  * RESTRICTED RIGHTS LEGEND:
  16.  *
  17.  * Use, duplication or disclosure by the Government is subject to
  18.  * restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
  19.  * Technical Data and Computer Software clause at DFARS 52.227-7013,
  20.  * and/or in similar or successor clauses in the FAR, DOD or NASA FAR
  21.  * Supplement. Unpublished - rights reserved under the Copyright Laws of
  22.  * the United States. Contractor is SILICON GRAPHICS, INC., 2011 N.
  23.  * Shoreline Blvd., Mountain View, CA 94039-7311
  24.  **************************************************************************
  25.  *
  26.  * File: imp.h
  27.  *
  28.  * Description: Primary include file for libimp, the SGI Image file format
  29.  *    API library. The library is a replacement for and is based upon
  30.  *    libimage by Paul Haeberli. One of the intents of libim is to
  31.  *    provide a documented, consistent, name space secure, ANSI
  32.  *    compatible API to the SGI Image file format.
  33.  *
  34.  **************************************************************************/
  35.  
  36.  
  37. #ident "$Revision: 1.9 $"
  38.  
  39.  
  40. #ifndef __IMP_IMP_H__
  41. #define __IMP_IMP_H__
  42.  
  43.  
  44. #include <sys/types.h>
  45.  
  46.  
  47. /* Error codes */
  48. /*    These error codes start well above the error codes defined in
  49.     errno.h. This way we can return errno error codes and libim
  50.     error codes.
  51. */
  52. #define IMP_ERR_BASE    500
  53.  
  54. #define IMP_ERR_READWRITE    IMP_ERR_BASE
  55. #define IMP_ERR_MEMALLOC    (IMP_ERR_BASE + 1)
  56. #define IMP_ERR_BADMAGIC    (IMP_ERR_BASE + 2)
  57. #define IMP_ERR_BADRASTER    (IMP_ERR_BASE + 3)
  58. #define IMP_ERR_BADIMAGE    (IMP_ERR_BASE + 4)
  59. #define IMP_ERR_BADROW        (IMP_ERR_BASE + 5)
  60. #define IMP_ERR_BADDIM        (IMP_ERR_BASE + 6)
  61. #define IMP_ERR_READFLAG    (IMP_ERR_BASE + 7)
  62. #define IMP_ERR_BADBPP        (IMP_ERR_BASE + 8)
  63. #define IMP_ERR_WRITEFLAG    (IMP_ERR_BASE + 9)
  64. #define IMP_ERR_READROW        (IMP_ERR_BASE + 10)
  65. #define IMP_ERR_SHORTREAD    (IMP_ERR_BASE + 11)
  66. #define IMP_ERR_SHORTWRITE    (IMP_ERR_BASE + 12)
  67. #define IMP_ERR_BADFD        (IMP_ERR_BASE + 13)
  68. #define IMP_ERR_SEEK        (IMP_ERR_BASE + 14)
  69. #define IMP_ERR_NOWRITE        (IMP_ERR_BASE + 15)
  70. #define IMP_ERR_NO_TAG        (IMP_ERR_BASE + 16)
  71.  
  72.  
  73. /* Image header constants */
  74.  
  75. /*    Magic number (imagic field) */
  76. #define IMP_MAGIC        0732    /* Magic number */
  77.  
  78. /*    Name string (name field) */
  79. #define IMP_NAME_MAX        79
  80.  
  81. /*    Raster type (type field) */
  82. #define IMP_RASTER_ENC_MASK    0xff00    /* Raster encoding mask */
  83. #define IMP_RASTER_ENC_VERBATIM    0x0000
  84. #define IMP_RASTER_ENC_RLE    0x0100
  85.  
  86. #define IMP_RASTER_BPP_MASK    0x00ff    /* Bytes per pixel mask */
  87. #define IMP_RASTER_BPP1        0x0001
  88. #define IMP_RASTER_BPP2        0x0002
  89.                     /* Combined codes */
  90. #define IMP_RASTER_VERBATIM1    (IMP_RASTER_ENC_VERBATIM | IMP_RASTER_BPP1)
  91. #define IMP_RASTER_VERBATIM2    (IMP_RASTER_ENC_VERBATIM | IMP_RASTER_BPP2)
  92. #define IMP_RASTER_RLE1        (IMP_RASTER_ENC_RLE | IMP_RASTER_BPP1)
  93. #define IMP_RASTER_RLE2        (IMP_RASTER_ENC_RLE | IMP_RASTER_BPP2)
  94.  
  95. /*    Image type (colormap field) */
  96. #define IMP_IMAGE_NORMAL    0    /* Rows are rgb or greyscale values */
  97. #define IMP_IMAGE_DITHERED    1    /* Obsolete format */
  98. #define IMP_IMAGE_SCREEN    2    /* Rows are indices for writepixels */
  99. #define IMP_IMAGE_COLORMAP    3    /* File is a colormap */
  100.  
  101. /*      Extension Tag identifiers */
  102. #define IMP_TAG_PTR_OFFSET    508
  103. #define IMP_TAG_LAST_TAG    0
  104. #define IMP_TAG_FIRST_TAG    1
  105. #define IMP_TAG_ICC_TAG        2
  106.  
  107.  
  108. /* Image header macros */
  109.  
  110. #define impMagic(img)        ((img)->imagic)
  111. #define impRasterType(img)    ((img)->type)
  112. #define        impRasterEncoding(img)    (((img)->type) & IMP_RASTER_ENC_MASK)
  113. #define        impRasterBPP(img)    (((img)->type) & IMP_RASTER_BPP_MASK)
  114. #define impDimension(img)    ((img)->dim)
  115. #define impXSize(img)        ((img)->xsize)
  116. #define impYSize(img)        ((img)->ysize)
  117. #define impNumChannels(img)    ((img)->zsize)
  118. #define impMinValue(img)    ((img)->min)
  119. #define impMaxValue(img)    ((img)->max)
  120. #define impName(img)        ((img)->name)
  121. #define impImageType(img)    ((img)->colormap)
  122. #define impTags(img)            ((img)->tags)
  123.  
  124. #define impIsRLE(img)        (impRasterEncoding(img) == IMP_RASTER_ENC_RLE)
  125. #define impIsVERBATIM(img)  (impRasterEncoding(img) == IMP_RASTER_ENC_VERBATIM)
  126. #define impMakeRasterType(enc,bpp)    (((enc) & IMP_RASTER_ENC_MASK) | \
  127.                      ((bpp) & IMP_RASTER_BPP_MASK))
  128. #define impHasTags(img)        (impTags(img) !=  NULL)
  129.  
  130.  
  131. /* Enums for image caching */
  132.  
  133. typedef enum _impCacheMode {
  134.     _IMPBufDirect = -1,
  135.     IMPNoCache = 0,
  136.     IMPHeapCache = 1,
  137.     IMPMapCache = 2
  138. } IMPCacheMode;
  139.  
  140.  
  141. /* Enums for zoom filter types */
  142.  
  143. typedef enum _impFilterType {
  144.     IMPReplicate = 0,
  145.     IMPImpulse = 0,
  146.     IMPBox = 1,
  147.     IMPTriangle = 2,
  148.     IMPQuadratic = 3,
  149.     IMPMitchell = 4,
  150.     IMPGaussian = 5
  151. } IMPFilterType;
  152.  
  153.  
  154. /* Function types for device CMYK functions */
  155.  
  156. typedef short (*IMPBGFunc)(short k);
  157. typedef short (*IMPUCRFunc)(short k);
  158.  
  159. /* Function type for routines that need a row read pointer */
  160.  
  161. typedef int (*IMPReadRowFunc)(short *buffer, ushort_t row, void *clientData);
  162.  
  163. typedef struct _IMPTagHeader{
  164.    __uint32_t           tagname;
  165.    __uint32_t           length;
  166. } IMPTagHeader;
  167.  
  168. typedef struct _IMPTag{
  169.    IMPTagHeader        header;
  170.    struct _IMPTag    *next;
  171.    void            *data;
  172. } IMPTag;
  173.  
  174.  
  175. /* SGI Image file header structure */
  176. /*    This is the header structure for SGI Image format files.
  177.     The names of the structure fields are identical to those
  178.     used in libimage. While libimage based programs reference
  179.     the fields directly, libimip based programs should use the
  180.     image header macros.
  181. */
  182.  
  183. typedef struct _impImage {
  184.     /*        Public image header information (archived) */
  185.     unsigned short    imagic;        /* SGI Image file magic number */
  186.     unsigned short     type;        /* Raster type (e.g. verbatim, rle) */
  187.     unsigned short     dim;        /* Image dimension */
  188.     unsigned short     xsize;        /* X size (pixels) */
  189.     unsigned short     ysize;        /* Y size (pixels) */
  190.     unsigned short     zsize;        /* Number of channels (e.g. rgb = 3) */
  191.     __int32_t         min;        /* Minimum intensity in image */
  192.     __int32_t         max;        /* Maximum intensity in image */
  193.     __uint32_t        wastebytes;
  194.     char         name[IMP_NAME_MAX+1];    /* Image name */
  195.     __uint32_t        colormap;    /* Image type (e.g. colormap, normal) */
  196.  
  197.     /*        Private image header information (core use only) */
  198.     __int32_t         file;        /* Image file descriptor */
  199.     unsigned short     flags;        /* Read/write flag */
  200.     short        dorev;        /* 1 = need byte swap, 0 = no swap */
  201.     short        x;        /* x, y and channel of last row seek */
  202.     short        y;
  203.     short        z;
  204.     short        cnt;
  205.     short        *ptr;
  206.     short        *base;
  207.     short        *tmpbuf;    /* RLE row temporary storage */
  208.     __uint32_t        offset;        /* Absolute file position */
  209.     __uint32_t        rleend;        /* RLE row end relative to start */
  210.     __uint32_t        *rowstart;    /* RLE row location offset table */
  211.     __int32_t        *rowsize;    /* RLE row size table */
  212.     /*        Private extensions */
  213.     off_t        start;        /* File position where image starts */
  214.     IMPCacheMode    cache;        /* Image caching mode */
  215.     void*        cachebuf;    /* Image cache buffer */
  216.     __uint32_t        cachesize;    /* Image cache buffer size */
  217.     off_t        cacheoffset;    /* Absolute cache position */
  218.     IMPTag        *tags;        /* pointer to first tag */
  219. } IMPImage;
  220.  
  221.  
  222. /* Filter shape structure */
  223. /*
  224.                         Y
  225.                         |
  226.     areaTab[i]     ***********
  227.               \  **     |     **
  228.                ****     |       **
  229.               *****     |         *
  230.     _________*|*|*|_|_|_|_|_|_|_|_|*_____ X
  231.  
  232.                   |     |<-radius->|
  233.              |    i                |
  234.             minX                  maxX
  235. */
  236.  
  237. typedef struct _impFilterShape {
  238.     float radius;               /* Half the width of the filter */
  239.     float minX, maxX;           /* X locations at +-radius */
  240.     float *areaTable;           /* Total area under curve at const X incrs */
  241. } IMPFilterShape;
  242.  
  243.  
  244. /* Filter structure */
  245.  
  246. typedef struct _impFilter {
  247.     int width;            /* Number of pixels or rows of source image
  248.                    spanned by filter */
  249.     int totalWeight;        /* Sum of all weighting factors in span */
  250.     int halfTotalWeight;    /* Half totalWeight */
  251.     short *weight;        /* Wieghting factor for each pixel of row */
  252.     short *data;        /* Pointer to source pixel or row where
  253.                    filter starts */
  254. } IMPFilter;
  255.  
  256.  
  257. /* Zoom structure */
  258.  
  259. typedef struct _impZoom {
  260.     /*        General zoom information */
  261.     IMPReadRowFunc readRowFunc;        /* Function to read row data */
  262.     int (*zoomRowFunc)(struct _impZoom*, short*, ushort_t, void*);
  263.     ushort_t srcXSize, srcYSize;    /* Original image size */
  264.     ushort_t dstXSize, dstYSize;    /* New image size */
  265.     IMPFilterType filterType;        /* Type of filter to use in zoom */
  266.     short *srcRowBuf;            /* Storage for one source row */
  267.     short *dstRowBuf;            /* Storage for one zoomed row */
  268.     int numChannels;            /* Number of packed channels per row */
  269.  
  270.     /*        Impulse (i.e. non-filtered) zoom information */
  271.     short **xMap;        /* Maps dst pixel back to src pixel */
  272.     int currentSrcRow;        /* Row number of last read source row */
  273.  
  274.     /*        Filtered zoom information */
  275.     float blurFactor;        /* Blurring (ie. filter width factor) */
  276.     int needClamp;        /* 1 = clamp output, 0 = no clamping needed */
  277.     IMPFilterShape *filterShape;    /* Filter shape area and info */
  278.     IMPFilter *xFilter;        /* Pixel filter array. One fltr per dst pixel */
  279.     IMPFilter *yFilter;        /* Row filter array. One filter per dst row */
  280.     /* Filtered row cache */
  281.     int maxFilterRows;        /* Max number of rows spanned by vert filter */
  282.     int curFilterRows;        /* Current number of cached filter rows */
  283.     int **filterRows;        /* Rows spanned by vertical filter */
  284.     int *accumBuf;        /* Integer size calculationr temp buffer */
  285.     int currentRowMax;        /* Last source image row read */
  286.     long min, max;        /* Minimum and maximum intensity */
  287.                 /* values; used for clamping */
  288. } IMPZoom;
  289.  
  290.  
  291. /* Public global variables */
  292.  
  293. extern int    IMPerrno;    /* Error variable */
  294.  
  295.  
  296. /* Public function declarations */
  297.  
  298. #ifdef __cplusplus
  299. extern "C" {
  300. #endif
  301. /*    Basic functions */
  302. extern IMPImage* impOpen(const char *fname, const char *mode, ...);
  303. extern IMPImage* impOpenFd(int fd, const char *mode, ...);
  304. extern IMPImage* impOpenBuf(void *buf, const char *mode, ...);
  305. extern IMPImage* impOpenExt(const char *filename, const char *mode,
  306.                 off_t offset, IMPCacheMode cache, ...);
  307. extern IMPImage* impOpenFdExt(int fd, const char *mode, off_t offset,
  308.                 IMPCacheMode cache, ...);
  309. extern IMPImage* impOpenBufExt(void *buf, const char *mode, off_t offset, ...);
  310. extern int    impClose(IMPImage *image);
  311. extern int    impCloseFd(IMPImage *image, int *fdp);
  312. extern int    impWriteRow(IMPImage *image, short *buffer,
  313.                 ushort_t row, ushort_t channel);
  314. extern int    impWriteRowB(IMPImage *image, uchar_t *buffer,
  315.                 ushort_t row, ushort_t channel);
  316. extern int    impReadRow(IMPImage *image, short *buffer,
  317.                 ushort_t row, ushort_t channel);
  318. extern int    impReadRowB(IMPImage *image, uchar_t *buffer,
  319.                 ushort_t row, ushort_t channel);
  320. extern void    impPerror(const char *str);
  321. extern char*    impErrorString(int errCode);
  322. extern int      impReadTag(IMPImage *image, uint_t tagname, void **buffer);
  323. extern int      impWriteTag(IMPImage *image, uint_t tagname, int length,
  324.                 void *buffer);
  325.  
  326. /*    Misc row operations */
  327.  
  328. extern void    impPackRow(uchar_t *dptr, short *sptr, int n);
  329. extern void    impUnpackRow(short *dptr, uchar_t *sptr, int n);
  330.  
  331. /*    Row math functions */
  332. extern void    impZeroRow(short *dptr, int n);
  333. extern void    impInitRow(short *dptr, int val, int n);
  334. extern void    impCopyRow(short *dptr, short *sptr, int n);
  335. extern void    impSAddRow(short *dptr, short *sptr, int val, int n);
  336. extern void    impVAddRow(short *dptr, short *sptr1, short *sptr2, int n);
  337. extern void    impSSubRow(short *dptr, short *sptr, int val, int n);
  338. extern void    impVSubRow(short *dptr, short *sptr1, short *sptr2, int n);
  339. extern void    impSMulRow(short *dptr, short *sptr, int val, int n);
  340. extern void    impSDivRow(short *dptr, short *sptr, int val, int n);
  341. extern void    impClampRow(short *dptr, short *sptr, int lov, int hiv, int n);
  342.  
  343. /*    Color conversion functions */
  344. /*        W */
  345. extern void    impRGBtoW(short *rbuf, short *gbuf, short *bbuf,
  346.                 short *wbuf, int n);
  347. extern void    impWtoRGB(short *wbuf, short *rbuf, short *gbuf, short *bbuf,
  348.                 int n);
  349. /*        K */
  350. extern void    impRGBtoK(short *rbuf, short *gbuf, short *bbuf,
  351.                 short *kbuf, short unity, int n);
  352. extern void    impKtoRGB(short *kbuf, short *rbuf, short *gbuf, short *bbuf,
  353.                 short unity, int n);
  354. /*        CMY */
  355. extern void    impRGBtoCMY(short *rbuf, short *gbuf, short *bbuf,
  356.                short *cbuf, short *mbuf, short *ybuf,
  357.                short unity, int n);
  358. extern void    impCMYtoRGB(short *cbuf, short *mbuf, short *ybuf,
  359.                short *rbuf, short *gbuf, short *bbuf,
  360.                short unity, int n);
  361. /*        YIQ */
  362. extern void    impRGBtoYIQ(short *rbuf, short *gbuf, short *bbuf,
  363.                short *ybuf, short *ibuf, short *qbuf,
  364.                int n);
  365. extern void    impYIQtoRGB(short *ybuf, short *ibuf, short *qbuf,
  366.                short *rbuf, short *gbuf, short *bbuf,
  367.                int n);
  368. /*        YUV */
  369. extern void    impRGBtoYUV(short *rbuf, short *gbuf, short *bbuf,
  370.                short *ybuf, short *ubuf, short *vbuf,
  371.                int n);
  372. extern void    impYUVtoRGB(short *ybuf, short *ubuf, short *vbuf,
  373.                short *rbuf, short *gbuf, short *bbuf,
  374.                int n);
  375. /*        YCbCr (CCIR 601) */
  376. extern void    impRGBtoYCbCr(short *rbuf, short *gbuf, short *bbuf,
  377.                short *ybuf, short *cbbuf, short *crbuf,
  378.                int n);
  379. extern void    impYCbCrtoRGB(short *ybuf, short *cbbuf, short *crbuf,
  380.                short *rbuf, short *gbuf, short *bbuf,
  381.                int n);
  382. /*        CMYK (optional transfer func, undercolor removal and K gen) */
  383. extern void    impRGBtoCMYK(short *rbuf, short *gbuf, short *bbuf,
  384.                short *cbuf, short *mbuf, short *ybug, short *kbuf,
  385.                short unity, int n);
  386. extern void    impRGBtoDevCMYK(short *rbuf, short *gbuf, short *bbuf,
  387.                short *cbuf, short *mbuf, short *ybug, short *kbuf,
  388.                IMPUCRFunc ucr, IMPBGFunc bg, short unity, int n);
  389. extern void    impCMYKtoRGB(short *cbuf, short *mbuf, short *ybuf,
  390.                short *kbuf, short *rbuf, short *gbug, short *bbuf,
  391.                short unity, int n);
  392. /*        HSV */
  393. extern void    impRGBtoHSV(short *rbuf, short *gbuf, short *bbuf,
  394.                float *hbuf, float *sbuf, float *vbuf, int n);
  395. extern void    impHSVtoRGB(float *hbuf, float *sbuf, float *vbuf,
  396.                short *rbuf, short *gbuf, short *bbuf, int n);
  397. /*        HLS */
  398. extern void    impRGBtoHLS(short *rbuf, short *gbuf, short *bbuf,
  399.                float *hbuf, float *lbuf, float *sbuf,
  400.                short unity, int n);
  401. extern void    impHLStoRGB(float *hbuf, float *lbuf, float *sbuf,
  402.                short *rbuf, short *gbuf, short *bbuf,
  403.                short unity, int n);
  404.  
  405. /*    Row zoom functions */
  406. extern IMPZoom*    impCreateZoom(ushort_t srcXSize, ushort_t srcYSize,
  407.                 ushort_t dstXSize, ushort_t dstYSize,
  408.                     long min, long max,
  409.                 IMPReadRowFunc readRowFunc, int numChannels,
  410.                 IMPFilterType filterType, float blurFactor);
  411. extern void    impDestroyZoom(IMPZoom *zoom);
  412. extern void    impResetZoom(IMPZoom *zoom);
  413. extern int    impZoomRow(IMPZoom *zoom, short *buffer, ushort_t row,
  414.                 void *clientData);
  415. #ifdef __cplusplus
  416. }
  417. #endif
  418.  
  419.  
  420. #endif /* !__IMP_IMP_H__ */
  421.  
  422.